/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package erp.financeiro.dao;

import erp.financeiro.Contrato;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import erp.financeiro.EstadoContrato;
import erp.financeiro.TipoContrato;
import erp.financeiro.TipoDeVencimentoContrato;
import java.util.Date;
import java.util.List;
import javax.persistence.Query;

/**
 *
 * @author luiz.vieira
 */
public class ContratoDAO {


    public static void cadastrar(String idDadosBancarios, String razaoSocial, String descricao, Date inicioContrato, Date vencimentoContrato, Double valorPorVencimento, TipoDeVencimentoContrato tipoDeVencimento, TipoContrato tipoDeContrato, Date diaDeRecebimento, EstadoContrato estado) throws Exception {

        Contrato dados = new Contrato();
        
        dados.setDescricao(descricao);
        dados.setDadosBancarios(DadosBancariosDAO.getDadosBancariosById(Long.parseLong(idDadosBancarios)));
        dados.setDiaDeRecebimento(diaDeRecebimento);
        dados.setEstado(estado);
        dados.setInicioContrato(inicioContrato);
        dados.setRazaoSocial(razaoSocial);
        dados.setTipoDeContrato(tipoDeContrato);
        dados.setTipoDeVencimento(tipoDeVencimento);
        dados.setValorPorVencimento(valorPorVencimento);
        dados.setVencimentoContrato(vencimentoContrato);
        dados.setUltimoLancamento(null);

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();
        
        em.getTransaction().begin();
        em.persist(dados);
        em.getTransaction().commit();
    }

    public static void alterar(String idDadosBancarios, Long Id, String razaoSocial, String descricao, Date inicioContrato, Date vencimentoContrato, Double valorPorVencimento, TipoDeVencimentoContrato tipoDeVencimento, TipoContrato tipoDeContrato, Date diaDeRecebimento, EstadoContrato estado, Date ultimoLancamento) throws Exception {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        Contrato dados = ContratoDAO.getContratoById(Id);

        dados.setDescricao(descricao);
        dados.setDadosBancarios(DadosBancariosDAO.getDadosBancariosById(Long.parseLong(idDadosBancarios)));
        dados.setDiaDeRecebimento(diaDeRecebimento);
        dados.setEstado(estado);
        dados.setInicioContrato(inicioContrato);
        dados.setRazaoSocial(razaoSocial);
        dados.setTipoDeContrato(tipoDeContrato);
        dados.setTipoDeVencimento(tipoDeVencimento);
        dados.setValorPorVencimento(valorPorVencimento);
        dados.setVencimentoContrato(vencimentoContrato);
        dados.setUltimoLancamento(ultimoLancamento);

        em.getTransaction().begin();
        em.merge(dados);
        em.getTransaction().commit();
    }

    public static List<Contrato> getContratos(EstadoContrato estado, TipoDeVencimentoContrato tipoDeVencimento, TipoContrato tipoDeContrato, String razaoSocial, Double valorInicial, Double valorFinal, Date vencimentoContrato) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();
        
        String sqlStr = "SELECT x FROM " + Contrato.class.getSimpleName() + " x";
        Boolean teveWhere = false;

        if (estado != null){
            if (!teveWhere){
               sqlStr = sqlStr + " where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.estado=:estado";
        }

        if (tipoDeVencimento != null){
            if (!teveWhere){
               sqlStr = sqlStr + " where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.tipoDeVencimento=:tipoDeVencimento";
        }

        if (tipoDeContrato != null){
            if (!teveWhere){
               sqlStr = sqlStr + " where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.tipoDeContrato=:tipoDeContrato";
        }

        if (razaoSocial != null){
            if (!teveWhere){
               sqlStr = sqlStr + " where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.razaoSocial=:razaoSocial";
        }

        if (vencimentoContrato != null){
            if (!teveWhere){
               sqlStr = sqlStr + " where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.vencimentoContrato=:vencimentoContrato";
        }

        if (valorInicial != null){
            if (!teveWhere){
               sqlStr = sqlStr + " where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.valorPorVencimento>=valorInicial";
        }

        if (valorFinal != null){
            if (!teveWhere){
               sqlStr = sqlStr + " where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.valorPorVencimento<=valorFinal";
        }

        Query query = em.createQuery(sqlStr);

        if (estado != null){
            query.setParameter("estado", estado);
        }
        if (tipoDeVencimento != null){
            query.setParameter("tipoDeVencimento", tipoDeVencimento);
        }
        if (tipoDeContrato != null){
            query.setParameter("tipoDeContrato", tipoDeContrato);
        }
        if (razaoSocial != null){
            query.setParameter("razaoSocial", razaoSocial);
        }
        if (valorInicial != null){
            query.setParameter("valorInicial", valorInicial);
        }
        if (valorFinal != null){
            query.setParameter("valorFinal", valorFinal);
        }
        if (vencimentoContrato != null){
            query.setParameter("vencimentoContrato", vencimentoContrato);
        }
        
        List<Contrato> list = (List<Contrato>) query.getResultList();

        return list;
    }

    public static Contrato getContratoById(Long id) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        return (Contrato) em.find(Contrato.class, id);
    }

    public static Boolean excluir(Long id){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        Contrato dados = (Contrato) em.find(Contrato.class, id);

        try{
            em.getTransaction().begin();
            em.remove(dados);
            em.getTransaction().commit();
        }catch(Exception e){
            return Boolean.FALSE;
        }
        return Boolean.TRUE;

    }
}
